
package com.lzx.adx.report.controller.v1.hw;

import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.crypto.SecureUtil;
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson.JSONObject;
import com.lzs.adx.commmon.utils.JsonUtils;
import com.lzs.adx.commmon.utils.Result;
import com.lzx.adx.report.bean.mapper.ReportMapper;
import com.lzx.adx.report.cache.AccountLocalCache;
import com.lzx.adx.report.dto.AccountDTO;
import com.lzx.adx.report.dto.ReportDTO;
import com.lzx.adx.report.enums.EventTypeEnums;
import com.lzx.adx.report.model.huawei.request.HwReportRequest;
import com.lzx.adx.report.model.huawei.request.HwUploadRequest;
import com.lzx.adx.report.service.ReportService;
import com.lzx.adx.report.util.AdPerUtil;
import com.lzx.adx.report.util.HwSecureUtil;
import com.lzx.adx.report.util.UrlUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import java.util.*;

/**
 * 广告上报
 */
@RequestMapping("/hw/elmUnion")
@RestController
@Slf4j
public class HwElmUnionReportController {


    @Autowired
    private  ReportService reportService;



    @Autowired
    private  ThreadPoolTaskExecutor reportExecutor;

    @Autowired
    private  ReportMapper reportMapper;







    @GetMapping("/report")
    public ResponseEntity hwReqport(HwReportRequest hwReportRequest, HttpServletRequest request){

      //参数转换
      if(StringUtils.isNotBlank(hwReportRequest.getTransunique_id())){
          hwReportRequest.setRequestId(hwReportRequest.getTransunique_id());
      }


       //1.收到监测的数据存储
        ReportDTO reportDTO=reportMapper.toReportDTO(hwReportRequest);
        reportDTO.setEventType(hwReportRequest.getType());
        reportDTO.setBizRequestId(IdUtil.fastUUID());
        reportDTO.setCreateTime(new Date());
        reportDTO.setUpdateTime(new Date());

        reportExecutor.execute(()->{
            reportService.saveData(reportDTO);
        });

        return ResponseEntity.ok(new Result());
    }







    @GetMapping("carlback")
    public ResponseEntity callBackUrl(String requestId,String event_type,String event_time) throws Exception {
         log.info("接收了回调信息，请求流水号{},回调类型为{}，回调时间{}",requestId,event_type,event_time);
         if(StringUtils.isBlank(event_time) || StringUtils.isBlank(event_type)){
             log.info("请求参数异常，event_type{},event_time{]",event_type,event_time);
             return ResponseEntity.status(HttpStatus.BAD_REQUEST).build();
         }

         //1.把转换结果更新到数据库
         Map<String,Object> params=new HashMap<>();
         params.put("bizRequestId",requestId);
         List<ReportDTO> list = reportService.list(params);
         ReportDTO reportDTO;
         if(CollectionUtil.isNotEmpty(list)){
              reportDTO = list.get(0);
              reportDTO.setResultType(event_type);
              reportDTO.setResultTime(event_time);
              reportDTO.setUpdateTime(new Date());
              reportService.updateData(reportDTO,event_type);
         }else{
             return ResponseEntity.status(HttpStatus.BAD_REQUEST).build();
         }



         AccountDTO accountDTO = AccountLocalCache.getInstance().get(reportDTO.getDspId());
            String sspExtend = accountDTO.getSspExtend();
            //如果不为空，且sspExtend
            if(StringUtils.isNotBlank(sspExtend)){
                JSONObject jsonObject = JSONObject.parseObject(sspExtend);
                Double per = jsonObject.getDouble("per");
                if(Objects.nonNull(per)){

                    if(!AdPerUtil.randomPer(per)){
                        return ResponseEntity.ok(new Result());
                    }
                }
            }

         log.info("从数据库查询的数据为{}",JsonUtils.toJsonString(reportDTO));
         //2.回调渠道，调用华为回传接口
         Long conversion_time=Long.valueOf(reportDTO.getResultTime())/1000;
         HwUploadRequest hwUploadRequest=new HwUploadRequest();
         hwUploadRequest.setOaid(reportDTO.getOaid());
         hwUploadRequest.setConversion_type(EventTypeEnums.getHwCode(reportDTO.getResultType()));
         hwUploadRequest.setTimestamp(String.valueOf(System.currentTimeMillis()));
         hwUploadRequest.setCallback(reportDTO.getCallback());
         hwUploadRequest.setCampaign_id(reportDTO.getCampaignId());
         hwUploadRequest.setContent_id(reportDTO.getContentId());

         hwUploadRequest.setConversion_time(String.valueOf(conversion_time));
         hwUploadRequest.setTracking_enabled("1");
         String paramsBody = JsonUtils.toJsonString(hwUploadRequest);

         log.info("账号为【{}】，给华为请求的参数为{}",reportDTO.getDspId(),paramsBody);
         Map<String,String> header=new HashMap<>();

         header.put("Authorization", HwSecureUtil.buildAuthorizationHeader(paramsBody,accountDTO.getSspKey()));

         HttpRequest body = HttpUtil.createPost(accountDTO.getSspApiUrl()).addHeaders(header).body(paramsBody);
         String result = body.execute().body();
         log.info("账号为【{}】，接收华为转换响应的结果为{}",reportDTO.getDspId(),result);
         JSONObject jsonObject=JSONObject.parseObject(result);
         Integer resultCode = jsonObject.getInteger("resultCode");
         if(resultCode==0){
             return ResponseEntity.ok(new Result());
         }else{
             return ResponseEntity.status(HttpStatus.SERVICE_UNAVAILABLE).body(new Result<>().error());
         }
   }


   @GetMapping("/call")
    public ResponseEntity callTest(String requestId,String event_type,String event_time) throws Exception {
       log.info("ss接收了回调信息，请求流水号{},回调类型为{}，回调时间{}",requestId,event_type,event_time);
       return ResponseEntity.ok(new Result());
    }
}
